package springsecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.ObjectPostProcessor;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
import springsecurity.authentication.AccessHandler;
import springsecurity.authentication.CustomAccessDecisionManager;
import springsecurity.authentication.CustumerMetaDataSourcr;

import javax.annotation.Resource;
import javax.servlet.http.HttpServlet;

/**
 * @author cc
 * @date 2022/6/13 19:56
 * @Description :
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Resource
    public AccessHandler accessHandler;
    @Resource
    public AuthConfig authConfig;

    @Bean
    public PasswordEncoder pwd(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {


        //不再需要csrf及session管理
        http
         .csrf().disable();

//        http.formLogin()
//                // 自定义登录页面
//                .loginPage("/login.html")
//                // 自定义登录逻辑,login.html页面的请求发送过来，由下面的的登录逻辑接收，转而去执行 UserServiceImp实现类
//                .loginProcessingUrl("/login")
//                .successForwardUrl("/toMain")
//                //失败页面，但是因为没放行，当进入这个页面的时候，返回到登录页面
//                .failureForwardUrl("/toFail")
//                .and()
//                .authorizeRequests()
//                //允许哪些页面，或者是请求 放行
//                .antMatchers("/login.html").permitAll()
//                .antMatchers("/auth.html").hasAuthority("mhyx,test")
//                // 让其他没有被上面允许的请求，要经过认证(登录)之后  才可以访问 如：/toMain /main.html
//                .anyRequest().authenticated()
//                .and()
//                .exceptionHandling()
//                .accessDeniedHandler(accessHandler);
//
        //自定义登录验证信息


        //禁用session
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        // 用户自定义登陆验证信息
        http.formLogin()
                // 自定义登录页面
                .loginPage("/login.html")
                // 自定义登录逻辑,login.html页面的请求发送过来，由下面的的登录逻辑接收，转而去执行 UserServiceImp实现类
                .loginProcessingUrl("/login")
                .successForwardUrl("/toMain")
                //失败页面，但是因为没放行，当进入这个页面的时候，返回到登录页面
                .failureForwardUrl("/toFail")
                .and()
                .authorizeRequests()
                .anyRequest().authenticated()
                //动态url获取 自定义过滤 url地址
                .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                    @Override
                    public <O extends FilterSecurityInterceptor> O postProcess(O fsl) {
                        fsl.setSecurityMetadataSource(new CustumerMetaDataSourcr(authConfig));
                        fsl.setAccessDecisionManager(new CustomAccessDecisionManager());
                        return fsl;
                    }
                });

    }
}
